//=============================================================================
/**
 *
 *	@file		comm_wait.c
 *	@brief		通信同期画面
 *	@author		hosaka genya
 *	@data		2009.05.06
 *
 */
//=============================================================================
#include "common.h"
#include "gflib/touchpanel.h"
#include "system/wipe.h"
#include "system/window.h"
#include "system/arc_util.h"
#include "system/arc_tool.h"
#include "system/pmfprint.h"
#include "communication/wm_icon.h"

#include "system/msgdata_util.h"

#include "msgdata/msg.naix"
#include "msgdata/msg_pokethlon.h"

#include "../../pkthln_comm_pack.h"
#include "../../pkthln_frame_seq_def.h"

#include "../evt_msg.h"

#include "comm_wait.h"

//=============================================================================
/**
 *								定数定義
 */
//=============================================================================
enum{
	COMM_WAIT_HEAP_SIZE	= 0x40000,	///< 使用ヒープサイズ
	END_WAIT_SYNC		= 15,		///< 同期完了後の待機SYNC
	SYNC_ID				= PKTHLN_SYNC_ID_GAME_START_WAIT, ///< 同期ID
};

//=============================================================================
/**
 *								構造体定義
 */
//=============================================================================

//--------------------------------------------------------------
///	メインワーク
//==============================================================
typedef struct PKTHLN_COMM_WAIT_tag {
	// [SYSTEM]
	HEAPID HeapID;
	GF_BGL_INI* bgl;
	MSG_CNT_PTR MsgCnt;
	// [LOCAL]
	int Timer;
} PKTHLN_COMM_WAIT;


//=============================================================================
/**
 *							プロトタイプ宣言
 */
//=============================================================================
static void SetVramBank( void );
static void VBlankFunc( void* work );
static void BG_Init( GF_BGL_INI* ini, HEAPID HeapID );
static void BG_Delete( PKTHLN_COMM_WAIT_PTR ptr );
static void Scene_Init( PKTHLN_PTR work );
static void Scene_Exit( PKTHLN_PTR work );

static BOOL COMM_WAIT_Func_Main( PKTHLN_PTR work, u8* seq );

enum{
	COMM_WAIT_MAIN = 0,
};

PKTHLN_FUNC CommWaitFuncTbl[] = {
	COMM_WAIT_Func_Main,
};

//=============================================================================
/**
 *								外部公開関数
 */
//=============================================================================

//-----------------------------------------------------------------------------
/**
 *	@brief	通信同期画面 初期化
 *
 *	@param	PKTHLN_PTR work
 *	@param	pParam
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
PTH_RC PE_CommWait_InitFunc( PKTHLN_PTR work, void* pParam )
{
	PKTHLN_COMM_WAIT_PTR ptr = PTFrame_GetEventWorkPtr(work);
	u8 seq = PTFrame_GetSubSeq(work);

	switch(seq)
	{
		case 0:
			Scene_Init(work);
			PTFrame_IncSubSeq(work);
			break;

		case 1:
			// 通信アイコンを起動
			WirelessIconEasyPokethlon( NNS_G2D_VRAM_TYPE_2DMAIN );
			// OBJ表示設定
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_OFF );
			// ブラックイン
			WIPE_SYS_Start(	WIPE_PATTERN_WMS, WIPE_TYPE_FADEIN, WIPE_TYPE_FADEIN, WIPE_FADE_BLACK, 4, 1, ptr->HeapID );

			PTFrame_IncSubSeq(work);
			break;

		case 2:
			if( WIPE_SYS_EndCheck() )
			{
				MSG_CNT_PrintMessage( ptr->MsgCnt, msg_pkthln_comm_wait );

				PTFrame_IncSubSeq(work);
			}
			break;

		case 3:
			if( MSG_CNT_Main( ptr->MsgCnt ) == FALSE )
			{
				// 通信待機アイコン表示
				MSG_CNT_TimeWaitIconAdd( ptr->MsgCnt );
				// 同期待ち開始
				PTFrame_SetSynchroID( work, SYNC_ID );

				HOSAKA_PRINT("comm_wait init end \n");
				// 初期化終了
				return PTH_RC_END;
			}
			break;

		default : GF_ASSERT(0);
	}

	return PTH_RC_LOOP;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	通信同期画面 描画
 *
 *	@param	PKTHLN_PTR work
 *	@param	pParam
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
BOOL PE_CommWait_DrawFunc( PKTHLN_PTR work, void* pParam )
{
	return TRUE;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	通信同期画面 終了
 *
 *	@param	PKTHLN_PTR work
 *	@param	pParam
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
BOOL PE_CommWait_EndFunc( PKTHLN_PTR work, void* pParam )
{
	Scene_Exit( work );

	HOSAKA_PRINT("comm_wait end \n");

	return TRUE;
}

//=============================================================================
/**
 *								static関数
 */
//=============================================================================

//-----------------------------------------------------------------------------
/**
 *	@brief	VRAM設定
 *
 *	@param	void
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static void SetVramBank( void )
{
	GF_BGL_DISPVRAM tbl = {
		GX_VRAM_BG_128_A,				// メイン2DエンジンのBG
		GX_VRAM_BGEXTPLTT_NONE,			// メイン2DエンジンのBG拡張パレットM
		GX_VRAM_SUB_BG_128_C,			// サブ2DエンジンのBG
		GX_VRAM_SUB_BGEXTPLTT_32_H,		// サブ2DエンジンのBG拡張パレット

		GX_VRAM_OBJ_128_B,				// メイン2DエンジンのOBJ
		GX_VRAM_OBJEXTPLTT_NONE,		// メイン2DエンジンのOBJ拡張パレット

		GX_VRAM_SUB_OBJ_16_I,			// サブ2DエンジンのOBJ
		GX_VRAM_SUB_OBJEXTPLTT_NONE,	// サブ2DエンジンのOBJ拡張パレット

		GX_VRAM_TEX_NONE,				// テクスチャイメージスロット
		GX_VRAM_TEXPLTT_NONE			// テクスチャパレットスロット
	};
	GF_Disp_SetBank( &tbl );

}

//-----------------------------------------------------------------------------
/**
 *	@brief	VBlank関数
 *
 *	@param	void* work
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static void VBlankFunc( void* work )
{
	PKTHLN_COMM_WAIT_PTR ptr = work;

	GF_BGL_VBlankFunc( ptr->bgl );
	OS_SetIrqCheckFlag( OS_IE_V_BLANK );
}

//-----------------------------------------------------------------------------
/**
 *	@brief	BG初期化
 *
 *	@param	PKTHLN_COMM_WAIT_PTR ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static void BG_Init( GF_BGL_INI* ini, HEAPID HeapID )
{

	{	// -- BG SYSTEM --
		GF_BGL_SYS_HEADER BGsys_data = {
			GX_DISPMODE_GRAPHICS,GX_BGMODE_0,GX_BGMODE_0,GX_BG0_AS_2D
		};
		GF_BGL_InitBG(&BGsys_data);
	}

	{
		GF_BGL_BGCNT_HEADER bg_data[] = {
			// -- MAIN --
			{	// BG_0 ベース
				0,0,0x800,0,GF_BGL_SCRSIZ_256x256,GX_BG_COLORMODE_16,
				GX_BG_SCRBASE_0x0000,GX_BG_CHARBASE_0x04000,GX_BG_EXTPLTT_01,
				0,0,0,FALSE
			},
		};

		GF_BGL_BGControlSet( ini, GF_BGL_FRAME0_M, &(bg_data[0]), GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( ini, GF_BGL_FRAME0_M );
		GF_BGL_ClearCharSet( GF_BGL_FRAME0_M, 64, 0, HeapID );
	}

	// 未使用BGは非表示
	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_OFF );
	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_ON );

	// バックドロップ面を黒くする
	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_M, 0 );
	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_S, 0 );
}


//-----------------------------------------------------------------------------
/**
 *	@brief	BG削除
 *
 *	@param	PKTHLN_COMM_WAIT_PTR ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static void BG_Delete( PKTHLN_COMM_WAIT_PTR ptr )
{
	GF_BGL_BGControlExit( ptr->bgl, GF_BGL_FRAME0_M );

	// BGL開放
	sys_FreeMemoryEz(ptr->bgl);
}

//-----------------------------------------------------------------------------
/**
 *	@brief	Scene開始
 *
 *	@param	PKTHLN_PTR work
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static void Scene_Init( PKTHLN_PTR work )
{
	HEAPID heap_id;
	PKTHLN_COMM_WAIT_PTR ptr;

	heap_id = HEAPID_PT_COMM_WAIT;

	sys_CreateHeap( HEAPID_POKETHLON, heap_id, COMM_WAIT_HEAP_SIZE );

	// Blank Set
	sys_VBlankFuncChange( NULL, NULL );
	sys_HBlankIntrSet( NULL, NULL );

	GF_Disp_GX_VisibleControlInit();
	GF_Disp_GXS_VisibleControlInit();
	GX_SetVisiblePlane( 0 );
	GXS_SetVisiblePlane( 0 );

	//VRAMバンク割り当て
	SetVramBank();

	// アプリメモリ
	ptr = PTFrame_AllocEventWork(work, sizeof(PKTHLN_COMM_WAIT));
	MI_CpuClear8( ptr, sizeof(PKTHLN_COMM_WAIT) );

	// メインワーク初期化
	{
		ptr->HeapID = heap_id;

		// BG 初期化
		ptr->bgl = GF_BGL_BglIniAlloc( ptr->HeapID );
		BG_Init( ptr->bgl, ptr->HeapID );

		ptr->MsgCnt = MSG_CNT_Create( ptr->HeapID );
	}

	MSG_CNT_Init( ptr->MsgCnt, ptr->bgl, GF_BGL_FRAME0_M, PTFrame_GetGameType(work), PTFrame_GetSaveData(work) );

	sys_VBlankFuncChange( VBlankFunc, ptr );	// VBlankセット

	//上画面をメインにする
	sys.disp3DSW = DISP_3D_TO_MAIN;
	GF_Disp_DispSelect();
}

//-----------------------------------------------------------------------------
/**
 *	@brief	Scene終了
 *
 *	@param	PKTHLN_PTR work
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static void Scene_Exit( PKTHLN_PTR work )
{
	PKTHLN_COMM_WAIT_PTR ptr = PTFrame_GetEventWorkPtr(work);

	sys_VBlankFuncChange( NULL, NULL );	// VBlankセット
	sys_HBlankIntrSet( NULL,NULL );		// HBlankセット

	WirelessIconEasyEnd();

	MSG_CNT_Delete( ptr->MsgCnt );

	BG_Delete(ptr);

	//イベントワーク解放
	PTFrame_FreeEventWork(work);

	//ヒープ解放
	sys_DeleteHeap( HEAPID_PT_COMM_WAIT );
}

//-----------------------------------------------------------------------------
/**
 *	@brief	PHASE:メイン
 *
 *	@param	PKTHLN_PTR work
 *	@param	seq
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static BOOL COMM_WAIT_Func_Main( PKTHLN_PTR work, u8* seq )
{
	PKTHLN_COMM_WAIT_PTR ptr = PTFrame_GetEventWorkPtr(work);

	switch((*seq))
	{
		case 0:
			if( ++ptr->Timer > END_WAIT_SYNC )
			{
				// 通信待機アイコン削除
				MSG_CNT_TimeWaitIconDel( ptr->MsgCnt );

				WIPE_SYS_Start(	WIPE_PATTERN_WMS, WIPE_TYPE_FADEOUT, WIPE_TYPE_FADEOUT, WIPE_FADE_BLACK, 4, 1, ptr->HeapID );

				(*seq)++;
			}
			break;

		case 1:
			if( WIPE_SYS_EndCheck() )
			{
				MSG_CNT_PrintEnd( ptr->MsgCnt );

				HOSAKA_PRINT("comm_wait main end \n");
				return TRUE;
			}
			break;

		default : GF_ASSERT(0);
	}

	return FALSE;
}